package com.ynet.middleground.user.utils;

import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;

import org.json.XML;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;
import com.ynet.core.log.IfpLogger;
import com.ynet.host.client.HostSenderService;
import com.ynet.host.http.HttpRequest;
import com.ynet.host.http.HttpResponse;

/**
 * @description api 请求工具类
 */
@Component
public class ApiUtil {

    @Autowired
    private HostSenderService hostSenderService;

    /**
     * 向 api 服务发送请求
     *
     * @param headMap 请求头参数
     * @param params 请求信息参数
     * @param url 请求完整地址
     * @param httpMethod 请求方式
     * @param desc 服务提供商名称
     * @return api 服务响应对象
     */
    public JSONObject sendApi(Map<String, String> headMap, Map<String, Object> params, String url, String httpMethod,
        String desc) {
        HttpRequest request = new HttpRequest();
        request.setUrl(url);
        request.setMethod(httpMethod);
        request.setMessage(params);
        if ("GET".equalsIgnoreCase(httpMethod)) {
            Map<String, String> getParams = new HashMap<>(16);
            params.forEach((k, v) -> {
                getParams.put(k, String.valueOf(v));
            });
            request.setParams(getParams);
        }
        request.setHeader(headMap);
        JSONObject apiResult;
        Object json = JSONObject.toJSON(request);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 开始 " + LocalDate.now() + "请求地址" + url);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 开始 " + LocalDate.now() + "请求" + desc + "\n参数：" + json, request);
        HttpResponse response = (HttpResponse)hostSenderService.request("id_http", request, JSONObject.class);

        Object responseJson = JSONObject.toJSON(response);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 结束 " + LocalDate.now() + desc + "响应\n报文：" + responseJson, response);
        // 这是响应的头信息
        // 这是响应的 http 状态码，只有合法的状态才会返回，其它状态码会抛异常
        // 200 为默认的合法状态码，如有需求，可在 yml 中可自定义其它状态码
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 请求" + desc + " api 服务, api 地址: {}， 响应状态码，status: {}", url, response.getStatus());
        // 这是响应的报文体反格式化之后的对象
        apiResult = (JSONObject)response.getMessage();
        return apiResult;
    }

    /**
     * 向 api 服务发送请求
     *
     * @param headMap 请求头参数
     * @param params 请求信息参数
     * @param url 请求完整地址
     * @param httpMethod 请求方式
     * @param desc 服务提供商名称
     * @return api 服务响应对象
     */
    public String sendXMLApi(Map<String, String> headMap, String params, String url, String httpMethod, String desc) {
        HttpRequest request = new HttpRequest();
        request.setUrl(url);
        request.setMethod(httpMethod);
        request.setMessage(params);
        // if ("GET".equalsIgnoreCase(httpMethod)) {
        // Map<String, String> getParams = new HashMap<>(16);
        // params.forEach((k, v) -> {
        // getParams.put(k, String.valueOf(v));
        // });
        // request.setParams(getParams);
        // }
        request.setHeader(headMap);
        JSONObject apiResult;
        Object json = JSONObject.toJSON(request);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 开始 " + LocalDate.now() + "请求地址" + url);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 开始 " + LocalDate.now() + "请求" + desc + "\n参数：" + json, request);
        HttpResponse response = (HttpResponse)hostSenderService.request("id_http_xml", request, XML.class);

        Object responseJson = JSONObject.toJSON(response);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 结束 " + LocalDate.now() + desc + "响应\n报文：" + responseJson, response);
        // 这是响应的头信息
        // 这是响应的 http 状态码，只有合法的状态才会返回，其它状态码会抛异常
        // 200 为默认的合法状态码，如有需求，可在 yml 中可自定义其它状态码
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 请求" + desc + " api 服务, api 地址: {}， 响应状态码，status: {}", url, response.getStatus());
        // 这是响应的报文体反格式化之后的对象
        // apiResult = (JSONObject)response.getMessage();
        return response.getMessage().toString();
    }

    /**
     * 向 api 服务发送请求
     *
     * @param headMap 请求头参数
     * @param params 请求信息参数
     * @param url 请求完整地址
     * @param httpMethod 请求方式
     * @param desc 服务提供商名称
     * @return api 服务响应对象
     */
    public JSONObject sendApiParam(Map<String, String> headMap, Map<String, Object> params, String url,
        String httpMethod, String desc) {
        HttpRequest request = new HttpRequest();
        request.setMethod(httpMethod);
        request.setMessage(params);

        Map<String, String> getParams = new HashMap<>(16);
        params.forEach((k, v) -> getParams.put(k, String.valueOf(v)));

        request.setParams(getParams);
        request.setUrl(url);
        request.setHeader(headMap);

        JSONObject apiResult;
        Object json = JSONObject.toJSON(request);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 开始 " + LocalDate.now() + "请求地址: " + url);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 开始 " + LocalDate.now() + "请求" + desc + "\n参数：" + json, request);
        HttpResponse response = (HttpResponse)hostSenderService.request("id_http_x", request, JSONObject.class);

        Object responseJson = JSONObject.toJSON(response);
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 结束 " + LocalDate.now() + desc + "响应\n报文：" + responseJson, response);
        // 这是响应的头信息
        // 这是响应的 http 状态码，只有合法的状态才会返回，其它状态码会抛异常
        // 200 为默认的合法状态码，如有需求，可在 yml 中可自定义其它状态码
        IfpLogger.info(Thread.currentThread().getStackTrace()[1].getMethodName(),
            " 请求" + desc + " api 服务, api 地址: {}， 响应状态码，status: {}", url, response.getStatus());
        // 这是响应的报文体反格式化之后的对象
        apiResult = (JSONObject)response.getMessage();
        return apiResult;
    }
}
